Variables, operadores y funciones en R


In [ ]:
Sys.setlocale("LC_ALL", 'en_US.UTF-8')

Uso de variables tipo escalar

En R existen múltiples manera de asignar valores a una variable


In [ ]:
x = 10
x

In [ ]:
x <- 10
x

El operador = puede ser usado como instrucción a nivel del prompt o como subexpresión dentro de una lista. Eso sí, no puede ser evaluada como parámetro dentro de una función.


In [ ]:
y=10
y

{
    y=20
    y
}

In [ ]:
median(y = 1:10)
y

El operador <- puede ser usado como instrucción en cualquier nivel. Sí puede ser evaluado como parámetro dentro de una función.


In [ ]:
y <- 10
y

{
    y <- 20
    y
}

In [ ]:
median(y <- 1:10)
y

Operadores de comparación lógica

  • < para menor que
  • > para mayor que
  • <= para menor o igual que
  • >= para mayor o igual que
  • == para verificar si variables son iguales
  • != no son iguales entre ellas

In [ ]:
10 > 5

In [ ]:
10 < 5

Uso de variables tipo vector

El análisis de datos en R se hace generalmente usando vectores, matrices y dataframes

Para definir un vector en R usamos la función combine, la cual se llama con c()


In [ ]:
edad = c(35, 37, 30, 45, 40, 36, 45, 32, 52, 42, 30, 48 )
edad

Una vez definido el vector, uno puedo aplicar funciones estadísiticas tales como:

  • mean: Promedio
  • median: Mediana
  • sd: Desviación estándar

In [ ]:
mean(edad)
median(edad)
sd(edad)

Uso de variables tipo matriz

Las variables tipo escalar y vector son útiles a la hora de analizar situaciones con pocos datos. Como iremos viendo a lo largo del curso, la mayoría de los proyectos de análsis de datos requieren usar bases de datos o tablas que contienen múltiples columnas y filas. Una manera de manipular este tipo de datos es usando matrices.


In [ ]:
region = c("Arica y Parinacota","Tarapacá","Antofagasta","Atacama","Coquimbo","Valparaíso","Metropolitana de Santiago","Libertador General Bernardo O'Higgins","Maule","Biobío","La Araucanía","Los Ríos","Los Lagos","Aisén del General Carlos Ibáñez del Campo","Magallanes y de la Antártica Chilena")
poblacion = c(308271,205566,551627,292054,714856,1859312,7150480,903248,1073635,2025995,933537,380618,835829,106893,158828)
superficie = c(17446.20,41632.60,126048.80,74806.30,40967.80,12646.28,15547.00,16583.30,30340.30,37068.70,31842.30,18577.60,48583.30,107449.40,1392783.70)

In [ ]:
class(region)
class(poblacion)
class(superficie)

In [ ]:
chile = matrix(c(poblacion,superficie), ncol=2, byrow=FALSE)
chile

In [ ]:
class(chile)

In [ ]:
colnames(chile)=c("poblacion","superficie")
rownames(chile)=region
chile

Una vez que los datos están ordenados en forma matricial, es mucho más fácil responder preguntas tales como

  • ¿Cuáles son las regiones con mayor población?
  • ¿Cuáles son las regiones más pequeñas en superficie?
  • ¿Cuáles son las regiones con la mayor densidad de población por $km^2$?

In [ ]:
chile[order(chile[,"poblacion"],decreasing=TRUE),]

In [ ]:
chile[order(chile[,"superficie"],decreasing=FALSE),]

La densidad de población se define como el número de personas por unidad de superficie. En nuestro caso, sería simplemente dividir la columna poblacion por superficie.


In [ ]:
chile[,'poblacion']/chile[,'superficie']

In [ ]:
densidad = poblacion/superficie
densidad

Para agregar columnas a una matriz usaremos la función cbind()


In [ ]:
chile <- cbind(chile, densidad)
chile

¿Qué sucede si queremos agregar una nueva columna que tiene datos mixtos, digamos numéricos y caractéres?


In [ ]:
codigo_region <- c("XV","I","II","III","IV","V","XIII","VI","VII","VIII","IX","XIV","X","XI","XII")
class(codigo_region)

In [ ]:
chile <- cbind(chile, codigo_region)
chile

In [ ]:
class(chile)

¿Que tal si queremos volver a calcular la densidad de población usando las columnas poblacion y superficie?


In [ ]:
chile[,'poblacion']/chile[,'superficie']

¿Porqué falló la división si antes funcionaba? ¿Habrá sido porque incluimos la columna codigo_region la cual contenia tipos de datos mixtos?

Partamos imprimiendo los tipos de clase de las columnas poblacion y superficie


In [ ]:
class(chile[,'poblacion'])
class(chile[,'superficie'])

¿Qué sucedió?

La columna codigo_region es un vector que contiene datos de tipo caracter, y al ser incluida a la matriz todos los datos fueron convertidos al tipo de datos más general entre los tipos númerico y caracter: caracter.

Aquí vemos una gran limitación del tipo de datos matriz: No puede almacenar tipos de datos mixtos.

Uso de listas

Una lista es un vector genérico que puede contener otro tipo de objectos. Una lista puede contener escalares, caracterés, vectores numéricos, etc.


In [ ]:
region <- c("Arica y Parinacota","Tarapacá","Antofagasta")
poblacion <- c(308271,205566,551627)
superficie <- c(17446.20,41632.60,126048.80)
codigo_region <- c("XV","I","II")

# Podemos definir los labels de los elements usando names
chile = list(region, poblacion, superficie, codigo_region)
names(chile) = c("region","poblacion","superficie","codigo_region")
chile

# O directamente al momento de definir la lista
chile = list(region=region, poblacion=poblacion, superficie=superficie, codigo_region=codigo_region)
chile

In [ ]:
chile["region"]

In [ ]:
chile[c("region","poblacion")]

¿Que tal si queremos calcular la densidad de población?


In [ ]:
chile["poblacion"]/chile["superficie"]

La razón por la cual falla es porque chile[2] sigue siendo una lista, y nosotros en verdad queremos acceder directamente al vector numérico. Para ello usamos llave cuadrada doble [[]] .


In [ ]:
chile[["poblacion"]]/chile[["superficie"]]

Como podemos ver, las listas son un tipo de objeto que puede contener diferentes tipos de datos. A lo largo del curso iremos viendo situaciones donde las lostas son muy convenientes para almacenar datos.

Uso de DataFrames

Un dataframe es una estructura 2-dimensional que comparte propiedades entre una lista y una matriz. En estricto rigor, se define como una lista de vectores de igual largo.

Al igual que una lista y una matriz, un dataframe tiene las propiedades names(), colnames() y rownames(). En el caso del dataframe,

  • Las funciones names() y colnames() son equivalentes, y asignam los nombres de las columnas
  • La función rownames() asigna los nombres de las filas
  • Las funciones length() y ncol() son equivalentes, y entregan el número de columnas
  • La propiedad nrow()entrega el número de filas

In [ ]:
region <- c("Arica y Parinacota","Tarapacá","Antofagasta")
poblacion <- c(308271,205566,551627)
superficie <- c(17446.20,41632.60,126048.80)
codigo_region <- c("XV","I","II")

chile <- data.frame(poblacion, superficie, codigo_region)
colnames(chile) <- c("poblacion","superficie","codigo_region")
rownames(chile) <- region
chile

In [ ]:
chile["poblacion"]

In [ ]:
chile["densidad"] <- chile["poblacion"]/chile["superficie"]
chile

In [ ]:
region = c("Arica y Parinacota","Tarapacá","Antofagasta","Atacama","Coquimbo","Valparaíso","Metropolitana de Santiago","Libertador General Bernardo O'Higgins","Maule","Biobío","La Araucanía","Los Ríos","Los Lagos","Aisén del General Carlos Ibáñez del Campo","Magallanes y de la Antártica Chilena")
poblacion = c(308271,205566,551627,292054,714856,1859312,7150480,903248,1073635,2025995,933537,380618,835829,106893,158828)
superficie = c(17446.20,41632.60,126048.80,74806.30,40967.80,12646.28,15547.00,16583.30,30340.30,37068.70,31842.30,18577.60,48583.30,107449.40,1392783.70)
codigo_region <- c("XV","I","II","III","IV","V","XIII","VI","VII","VIII","IX","XIV","X","XI","XII")

chile <- data.frame(poblacion, superficie, codigo_region)
colnames(chile) <- c("poblacion","superficie","codigo_region")
rownames(chile) <- region
chile

Ordenar los datos del dataframe usando una columna


In [ ]:
chile[order(poblacion),]

In [ ]:
chile[order(-poblacion),]

Calcular promedios de columnas


In [ ]:
colMeans(chile["poblacion"])

In [ ]:
colMeans(chile[1:2])

Otra manera de calcular el promedio es usar la función apply()


In [ ]:
apply(chile["poblacion"], 2, mean)

In [ ]:
apply(chile["poblacion"], 2, sd)

In [ ]:
apply(chile["poblacion"], 2, sum)

Obtener un resumen del dataframe


In [ ]:
summary(chile)

In [ ]: